home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #9
/
Amiga Plus CD - 2004 - No. 09.iso
/
amigaplus
/
online
/
ibrowse_plugins
/
ibmht
/
mht.rexx
< prev
Wrap
OS/2 REXX Batch file
|
2004-08-03
|
6KB
|
257 lines
/*
* $VER: mht.rexx 1.01 (12.2.2003)
*
* ARexx script for IBrowse 1.2+
* Written by A Niven-Jenkins © 2002-2003 Cremlin Software
*
* Adds support for .mht files to IBrowse via an external viewer and YAM
*
* MIME Type: text/x-mht
* Extension: !mht
* Action: External viewer
* Viewer: SYS:RexxC/RX
* Arguments: <path>mht.rexx %f
*
*/
PARSE ARG pmhtfile
OPTIONS RESULTS
/* required libraries */
CALL ADDLIB('rexxsupport.library', 0, -30, 0)
/* specify a temporary directory */
ptempdir = 'T:'
/* specify the crlf stripper executable */
pcrlf2lf = 'C:CRLF2LF'
/* specify the name of yams "deleted" folder
nb. it is NOT case sensitive */
pdeleted = 'deleted'
/* .mht to mbox conversion */
pmboxhead = ptempdir || 'head.mbox'
pmboxbody = ptempdir || 'body.mbox'
pmboxfile = ptempdir || 'mht.mbox'
pmboxfrom = 'From xxx@xxx.xxx ddd mmm dd hh:nn:ss yyyy'
/* constants & variables */
pclstr = 'Content-Location:'
pmimetype = 'text/html'
pprotocol = 'file://localhost/'
pprotocollen = LENGTH(pprotocol)
purlindex = -1
pinfile = 'infile'
poutfile = 'outfile'
ptempfile = ptempdir || 'mhttemp'
pdeletedelay = 500
pfiles.count = 0
/* if yam isn't loaded, load it (iconified) */
IF ~SHOW('Ports', 'YAM') THEN DO
ADDRESS COMMAND
'Run >NIL: YAM:YAM HIDE NOCHECK'
'SYS:RexxC/WaitForPort YAM'
ADDRESS
ploadedyam = TRUE
END
/* convert <pmhtfile> into "mbox" format */
IF EXISTS(pmhtfile) THEN DO
ADDRESS COMMAND
'C:Echo ' || pmboxfrom || ' TO ' || pmboxhead
pcrlf2lf || ' >NIL: ' || pmhtfile || ' ' || pmboxbody
'C:Join ' || pmboxhead || ' ' || pmboxbody || ' TO ' || pmboxfile
ADDRESS
IF EXISTS(pmboxhead) THEN DELETE(pmboxhead)
IF EXISTS(pmboxbody) THEN DELETE(pmboxbody)
END
ELSE
CALL SHUTDOWN
/* find and store any <pclstr> header fields within <pmboxfile>
nb. yam uses "Content-Dispostion: attachment; filename="xxxxx"" */
IF OPEN(pinfile, pmboxfile) THEN DO
counter = 0
DO UNTIL EOF(pinfile)
pinstr = READLN(pinfile)
IF POS(pclstr, pinstr) > 0 THEN DO
pfiles.location.counter = STRIP(RIGHT(pinstr, LENGTH(pinstr) - LENGTH(pclstr)))
pfiles.filename.counter = PARSEFILENAME(pfiles.location.counter)
pfiles.filenamelen.counter = LENGTH(pfiles.filename.counter)
pfiles.saveas.counter = ptempdir || pfiles.filename.counter
pfiles.saveaslen.counter = LENGTH(pfiles.saveas.counter)
counter = counter + 1
END
END
pfiles.count = counter
CLOSE(pinfile)
END
ELSE
CALL SHUTDOWN
/* import <pmboxfile> into yam and save any attachments */
IF SHOW('Ports', 'YAM') THEN DO
ADDRESS YAM
FOLDERINFO STEM pofi.
GETSELECTED STEM pogs.
SETFOLDER pdeleted
GETSELECTED STEM pdgs.
NEWMAILFILE STEM pnmf.
MAILIMPORT pmboxfile
SETMAILFILE pnmf.filename
MAILREAD QUIET
READINFO STEM pri.
DO counter = 0 FOR pri.filename.count
pfiles.filetype.counter = pri.filetype.counter
READSAVE counter + 1 FILENAME pfiles.saveas.counter OVERWRITE
END
READCLOSE
MAILDELETE ATONCE FORCE
IF pdgs.num.count > 0 THEN DO
SETMAIL pdgs.num.0
DO counter = 0 FOR pdgs.num.count
LISTSELECT pdgs.num.counter
END
END
SETFOLDER pofi.name
IF pogs.num.count > 0 THEN DO
SETMAIL pogs.num.0
DO counter = 0 FOR pogs.num.count
LISTSELECT pogs.num.counter
END
END
ADDRESS
END
ELSE
CALL SHUTDOWN
/* replace any links within <pmimetype> type files with local equivalents
nb. the first occurrence will be taken as the main url */
DO counter = 0 FOR pfiles.count
IF pfiles.filetype.counter = pmimetype THEN DO
IF purlindex = -1 THEN purlindex = counter
CALL LOCALISELINKS(pfiles.saveas.counter)
END
END
/* pass <pfiles.saveas.<purlindex>> to ibrowse */
IF SHOW('Ports', 'IBROWSE') THEN DO
ADDRESS IBROWSE
GOTOURL pprotocol || pfiles.saveas.purlindex
ADDRESS
DELAY(pdeletedelay)
END
ELSE
CALL SHUTDOWN
/* SHUTDOWN()
deletes temporary files etc. */
SHUTDOWN:
/* delete <ptempfile>
nb. will not exist unless <LOCALISELINKS()> failed */
IF EXISTS(ptempfile) THEN DELETE(ptempfile)
/* delete <pfiles.saveas.n> */
DO counter = 0 FOR pfiles.count
IF EXISTS(pfiles.saveas.counter) THEN DELETE(pfiles.saveas.counter)
END
/* delete <pmboxfile> */
IF EXISTS(pmboxfile) THEN DELETE(pmboxfile)
/* if yam was loaded via script, quit it */
IF ploadedyam = TRUE THEN DO
ADDRESS YAM
QUIT FORCE
END
/* end gracefully */
EXIT 0
/* LOCALISELINKS()
replaces references to <pfiles.location.n>...<pfiles.filename.n> within
<pfile> with the equivalent <pfiles.saveas.n> */
LOCALISELINKS:
PARSE ARG pfile
IF RENAME(pfile, ptempfile) THEN DO
IF OPEN(pinfile, ptempfile) THEN DO
IF OPEN(poutfile, pfile, 'W') THEN DO
DO UNTIL EOF(pinfile)
pinstr = READLN(pinfile)
DO loop = 0 FOR pfiles.count
pstartpos = 0
pendpos = 1
DO UNTIL pstartpos = 0
pstartpos = POS(pfiles.filename.loop, pinstr, pendpos)
IF pstartpos > 0 THEN DO
ptempstr = LEFT(pinstr, pstartpos - 1)
ptemppos = MAX(LASTPOS(' ', ptempstr), LASTPOS('"', ptempstr), LASTPOS('=', ptempstr)) + 1
IF ptemppos > 1 THEN DO
pinstr = INSERT(pprotocol || pfiles.saveas.loop, DELSTR(pinstr, ptemppos, (pstartpos - ptemppos) + pfiles.filenamelen.loop), ptemppos - 1)
pendpos = ptemppos + pprotocollen + pfiles.saveaslen.loop
END
ELSE
pendpos = pstartpos + pfiles.filenamelen.loop
END
END
END
WRITELN(poutfile, pinstr)
END
CLOSE(poutfile)
END
ELSE
CALL SHUTDOWN
CLOSE(pinfile)
END
ELSE
CALL SHUTDOWN
IF EXISTS(ptempfile) THEN DELETE(ptempfile)
END
ELSE
CALL SHUTDOWN
RETURN
/* PARSEFILENAME()
returns the filename part of a fully qualified path */
PARSEFILENAME: PROCEDURE
PARSE ARG pfile
RETURN SUBSTR(pfile, MAX(LASTPOS(':', pfile), LASTPOS('/', pfile)) + 1)